#include "server.h"
#include "ui_server.h"

#include "client.h"
#include <QFile>

Server::Server(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Server)
{
    ui->setupUi(this);

    this->setWindowTitle("服务器端");
    this->move(200, 200);

    Client *c = new Client;
    c->show();
    c->move(1000, 200);

    // 1. 创建服务器端，并监听端口号
    this->server = new QTcpServer(this);
    this->server->listen(QHostAddress::Any, 8888);

    // 3. 当有客户端连入时，会触发 newConnection信号
    connect(this->server, &QTcpServer::newConnection, [this](){
        this->serverSocket = this->server->nextPendingConnection();
        QString ip = this->serverSocket->peerAddress().toString();
        quint16 port = this->serverSocket->peerPort();

        ui->textEdit->setText(QString("%1:%2 -- 已成功连入").arg(ip).arg(port));

        // 接收客户端发送的数据
        // 传输过来的文件名 和 文件内容 都由 buf 来保存了
        connect(this->serverSocket, &QTcpSocket::readyRead, [this](){
            // buf 接收到的数据有两种形式
            //  1) 带有特殊结构的文件名 ---> !@***#head!!!!##xxx.txt##xxxx
            //  2) 文件内容 ---> aaaaaaaaaaa
            QByteArray buf = this->serverSocket->readAll();
            if(buf.startsWith("!@***#head!!!!##"))
            {
                // 对文件名的处理
                this->list = QString(buf).split("##");

                this->fileTotalSize = list[2].toInt();
                this->file.setFileName("./uploads/" + list[1]);
                if(!this->file.open(QIODevice::WriteOnly))
                {
                    qDebug() << "文件打开失败";
                }
            }
            else
            {
                // 对文件内容的处理 -->写入文件
                this->fileUploadedSize += this->file.write(buf);
                // 如果已上传文件的大小等于文件总大小时，说明上传完毕，可以关闭文件
//                qDebug() << this->fileUploadedSize << this->fileTotalSize;
                if(this->fileUploadedSize >= this->fileTotalSize)
                {
                    file.close();

                    // 重置已上传文件大小的数据，方便继续接收上传文件
                    this->fileUploadedSize = 0;

                    ui->textEdit->append(QString("%1 已成功接收").arg(list[1]));
                    this->list.clear();
                }
            }
        });
    });
}

Server::~Server()
{
    delete ui;
}
